package ar.uba.fi.taller2.cmmiassistant.frontend.evaluacion.representacion;

import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;

import ar.uba.fi.taller2.cmmiassistant.controlador.Controlador;
import ar.uba.fi.taller2.cmmiassistant.frontend.PanelVista;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Continua;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Escalonada;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Evaluacion;
import ar.uba.fi.taller2.cmmiassistant.modelo.evaluacion.Representacion;
import ar.uba.fi.taller2.cmmiassistant.vista.Estado;
import ar.uba.fi.taller2.cmmiassistant.vista.Vista;

public class PanelSeleccionandoRepresentacion extends PanelVista {

    private static final long serialVersionUID = 6347875472481390480L;
    private static final String NINGUNA_REPRESENTACION = "ninguna";
    private JPanel panelSeleccion;
    private JToggleButton toggleButtonEscalonada;
    private JToggleButton toggleButtonContinua;
    private ButtonGroup buttonGroupSeleccion;
    private JPanel panelNiveles;
    private SeleccionandoNivel seleccionandoNivel;
    private SeleccionandoNivelesCapacidad seleccionandoNivelesCapacidad;
    private SeleccionandoNivelMadurez seleccionandoNivelMadurez;
    private CardLayout layoutPanelNiveles;

    public PanelSeleccionandoRepresentacion(Vista contexto) {
        super(contexto);
        this.initialize();
    }

    public void limpiar() {

        this.getToggleButtonContinua().setSelected(false);
        this.getToggleButtonEscalonada().setSelected(false);
        this.getLayoutPanelNiveles().show(this.getPanelNiveles(),
                NINGUNA_REPRESENTACION);
    }

    public void activar() {

        this.limpiar();

        Evaluacion evaluacion = this.getModelo().getEvaluacionSeleccionada()
                .getValor();

        JToggleButton toggleButton;
        
        if (this.getSeleccionandoNivelMadurez().correspondeRepresentacion(
                evaluacion)) {

            toggleButton = this.getToggleButtonEscalonada();
            
            
        } else if (this.getSeleccionandoNivelesCapacidad()
                .correspondeRepresentacion(evaluacion)) {

            toggleButton = this.getToggleButtonContinua();
            
            
        } else {
            
            toggleButton = this.getToggleButtonEscalonada();
        }
        
        toggleButton.doClick();

        super.activar();
    }

    private void setSeleccionandoNivel(SeleccionandoNivel seleccionandoNivel) {

        this.seleccionandoNivel = seleccionandoNivel;
        this.getSeleccionandoNivel().activar();
        this.getLayoutPanelNiveles().show(this.getPanelNiveles(),
                this.getSeleccionandoNivel().getEstado().getName());
    }

    private SeleccionandoNivel getSeleccionandoNivel() {

        return this.seleccionandoNivel;
    }

    private void initialize() {

        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        this.add(this.getPanelSeleccion());
        this.add(this.getPanelNiveles());
    }

    private JPanel getPanelNiveles() {

        if (this.panelNiveles == null) {

            this.panelNiveles = new JPanel();
            this.panelNiveles.setLayout(this.getLayoutPanelNiveles());

            this.panelNiveles.add(new JPanel(), NINGUNA_REPRESENTACION);
            this.addToPanelNiveles(this.getSeleccionandoNivelesCapacidad(),
                    true);
            this.addToPanelNiveles(this.getSeleccionandoNivelMadurez(), true);
        }

        return this.panelNiveles;
    }

    private CardLayout getLayoutPanelNiveles() {

        if (this.layoutPanelNiveles == null) {

            this.layoutPanelNiveles = new CardLayout();
        }
        return this.layoutPanelNiveles;
    }

    private void addToPanelNiveles(PanelVista panelVista, boolean useScrollPane) {

        this.panelNiveles.add(useScrollPane ? new JScrollPane(panelVista)
                : panelVista, panelVista.getEstado().getName());
    }

    private SeleccionandoNivelMadurez getSeleccionandoNivelMadurez() {

        if (this.seleccionandoNivelMadurez == null) {

            this.seleccionandoNivelMadurez = new SeleccionandoNivelMadurez(this);

        }

        return this.seleccionandoNivelMadurez;
    }

    private SeleccionandoNivelesCapacidad getSeleccionandoNivelesCapacidad() {

        if (this.seleccionandoNivelesCapacidad == null) {

            this.seleccionandoNivelesCapacidad = new SeleccionandoNivelesCapacidad(
                    this);

        }

        return this.seleccionandoNivelesCapacidad;
    }

    private JPanel getPanelSeleccion() {

        if (this.panelSeleccion == null) {

            this.panelSeleccion = new JPanel();
            this.panelSeleccion.setLayout(new BoxLayout(this.panelSeleccion,
                    BoxLayout.X_AXIS));
            this.panelSeleccion.add(this.getToggleButtonEscalonada());
            this.panelSeleccion.add(this.getToggleButtonContinua());
            this.panelSeleccion.add(Box.createHorizontalGlue());
        }

        return this.panelSeleccion;
    }

    private JToggleButton getToggleButtonContinua() {

        if (this.toggleButtonContinua == null) {

            this.toggleButtonContinua = new JToggleButton();
            this.toggleButtonContinua.setText("continua");
            this.configurarListenerToggleButton(this.toggleButtonContinua, this
                    .getSeleccionandoNivelesCapacidad());
            this.getButtonGroupSeleccion().add(this.toggleButtonContinua);
        }

        return this.toggleButtonContinua;
    }

    private JToggleButton getToggleButtonEscalonada() {

        if (this.toggleButtonEscalonada == null) {

            this.toggleButtonEscalonada = new JToggleButton();
            this.toggleButtonEscalonada.setText("escalonada");
            this.configurarListenerToggleButton(this.toggleButtonEscalonada,
                    this.getSeleccionandoNivelMadurez());
            this.getButtonGroupSeleccion().add(this.toggleButtonEscalonada);
        }

        return this.toggleButtonEscalonada;
    }

    private void configurarListenerToggleButton(JToggleButton toggleButton,
            final SeleccionandoNivel seleccionandoNivel) {

        toggleButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                PanelSeleccionandoRepresentacion.this
                        .setSeleccionandoNivel(seleccionandoNivel);

            }

        });
    }

    private ButtonGroup getButtonGroupSeleccion() {

        if (this.buttonGroupSeleccion == null) {

            this.buttonGroupSeleccion = new ButtonGroup();
        }

        return this.buttonGroupSeleccion;

    }

    public Estado getEstado() {

        return Estado.SELECCIONANDO_REPRESENTACION;
    }

    public Representacion getRepresentacion() {

        return this.getSeleccionandoNivel().seleccionarRepresentacion();
    }

    // public void setRepresentacion(Representacion representacion) {
    //
    // if (representacion instanceof Continua) {
    //
    // this.getToggleButtonContinua().setSelected(true);
    // this.setSeleccionandoNivel(this
    // .getSeleccionandoNivelesCapacidad());
    //
    // }
    //
    // if (representacion instanceof Escalonada) {
    //
    // this.getToggleButtonEscalonada().setSelected(true);
    // this.setSeleccionandoNivel(this.getSeleccionandoNivelMadurez());
    //
    // }
    // }

    public void setControlador(Controlador controlador) {

        super.setControlador(controlador);

        this.getSeleccionandoNivelesCapacidad().setControlador(controlador);
        this.getSeleccionandoNivelMadurez().setControlador(controlador);
    }

}
